
package controler;

import java.util.*;

/**
 * <p>Title: controler.Plateau </p>
 *
 * <p>Description: La classe Plateau du controler sert a maintenir la liste des cases du plateau</p>
 *
 * <p>Copyright: (c) 2008 FSSIM</p>
 *
 * <p>Company: FSSImock</p>
 *
 * @author Antoine Farnault
 * @author Augustin Couette
 * @author Sebastien Oger
 * @version 1.0
 */

public class Plateau {
	public ArrayList<Case> cases= new ArrayList<Case>();
	vue.panels.Plateau p;
	/**
	 * Constructeur de plateau
	 */
	public Plateau(vue.panels.Plateau p ) {
		this.p = p;
	}
	
	
	/**
	 * Methode getCase
	 * @param angle
	 * @param distance
	 * @return la case par rapport a une distance et un angle.
	 * Cette distance et l'angle sont calcules par rapport au clique de la souris
	 * Cette fonction retourne null, si le joueur a clique en dehors d'une case
	 */
	  public Case getCase(double angle, double distance) {
		Iterator<Case> it = cases.iterator();
		Case tmp;
		/*if(distance <  p.DIAMETRE-10*p.CASE_WIDTH){
			return cases.get(0);
		}*/
		while(it.hasNext()){
			tmp = it.next();
			if( (tmp.a<= angle && tmp.b >= angle) && (distance >= tmp.d && distance <= tmp.d + tmp.h)  ){ 
				return tmp;
			}
		}
		return null;
	}
	
	 /**
     * Algorithme pour avoir les cases accessibles
     * @param numcase
     * @param valeurDes
     */
    public ArrayList<Integer> casesAccessibles(int numCase, int valeurDes) {
        int parcouru = 0;  //Avancement
        int nbChemins = 0; //Nombre actuel de chemins trouves
        
        Case caseCourante = cases.get(numCase); //Recuperation de l'objet Case
        int[][] listeChemins = new int[7][valeurDes];
        
        // Initialisation des chemins en recuperant les voisins de la case
        for (int i = 0; i < caseCourante.getNbVoisin(); i++) {
            listeChemins[i][parcouru] = caseCourante.getVoisin(i);
            nbChemins++;
        }
        parcouru++;//On a parcouru une case
        
        while (parcouru < valeurDes) { // Tant que l'on peux avance
            int nbCheminsAtraiter = nbChemins; //Nombre de chemins a regarder
            for (int i = 0; i < nbCheminsAtraiter; i++) {
                caseCourante = cases.get(listeChemins[i][parcouru - 1]);
                
                if (caseCourante.getNbVoisin() > 2) {
                    int[] toAdd = new int[6];
                    int nbToAdd = 0;
                    
                    for (int k = 0; k < caseCourante.getNbVoisin(); k++) {
                        if (!isPresent(caseCourante.getVoisin(k),
                                listeChemins[i])
                                && caseCourante.getVoisin(k) != numCase) {
                            
                            toAdd[nbToAdd] = caseCourante.getVoisin(k);
                            nbToAdd++;
                        }
                    }
                    listeChemins[i][parcouru] = toAdd[0];
                    
                    for (int j = 1; j < nbToAdd; j++) {
                        for (int k = 0; k < valeurDes; k++) {
                            listeChemins[nbChemins][k] = listeChemins[i][k];
                        }
                        listeChemins[nbChemins][parcouru] = toAdd[j];
                        nbChemins++;
                    }
                } else { //Sinon on ajoute simplement les voisins
                    for (int j = 0; j < caseCourante.getNbVoisin(); j++) {
                        if (!isPresent(caseCourante.getVoisin(j),
                                listeChemins[i])
                                && caseCourante.getVoisin(j) != numCase) {
                            listeChemins[i][parcouru] = caseCourante
                                    .getVoisin(j);
                        }
                    }
                }
            }
            parcouru++;
        }
        ArrayList<Integer> vicini = new ArrayList<Integer>();
       System.out.print("Si je fais " + valeurDes + " je peux aller en : ");
        for (int i = 0; i < nbChemins; i++) {
            System.out.print(listeChemins[i][parcouru - 1] + ",");
            vicini.add(listeChemins[i][parcouru - 1]);
        }
        return vicini;
    }

    public static boolean isPresent(int element, int[] liste) {
        for (int i = 0; i < liste.length; i++) {
            if (liste[i] == element)
                return true;
        }
        return false;
    }
}
